#ifndef CLIENT_H
#define CLIENT_H

#include <stdint.h>
#include "crypto/sm2_keyex.h"

// 会话状态
#define SESSION_STATE_DISCONNECTED 0
#define SESSION_STATE_CONNECTED 1
#define SESSION_STATE_KEY_EXCHANGED 2
#define SESSION_STATE_AUTHENTICATED 3

// 文件传输状态
#define TRANSFER_STATE_NONE 0
#define TRANSFER_STATE_STARTING 1
#define TRANSFER_STATE_ACTIVE 2
#define TRANSFER_STATE_PAUSED 3
#define TRANSFER_STATE_COMPLETED 4
#define TRANSFER_STATE_ERROR 5
#define TRANSFER_STATE_CANCELLED 6

// 文件传输方向
#define TRANSFER_DIRECTION_NONE 0
#define TRANSFER_DIRECTION_UPLOAD 1
#define TRANSFER_DIRECTION_DOWNLOAD 2

// 文件信息结构体
typedef struct
{
    char filename[256];
    uint8_t is_dir;
    uint64_t size;
    uint64_t modified_time;
    uint8_t has_read_permission;
    uint8_t has_write_permission;
} __attribute__((packed)) file_info_t;

// 文件传输信息结构
typedef struct
{
    int transfer_id;
    int direction;
    int state;
    char src_path[256];
    char dst_path[256];
    uint64_t total_size;
    uint64_t transferred_size;
    int block_size;
    int current_block;
    int error_code;
} file_transfer_t;

// 客户端会话信息
typedef struct
{
    int sock;                         // 连接套接字
    int state;                        // 会话状态
    int user_id;                      // 用户ID（认证后有效）
    char username[32];                // 用户名
    uint8_t token[32];                // 会话令牌
    sm2_key_pair_t local_key;         // 本地SM2密钥对
    uint8_t remote_public_x[32];      // 远程SM2公钥X坐标
    uint8_t remote_public_y[32];      // 远程SM2公钥Y坐标
    uint8_t shared_key[32];           // 共享对称密钥
    uint16_t current_seq;             // 当前序列号
    file_transfer_t current_transfer; // 当前文件传输
    int reconnect_attempts;           // 重连尝试次数
    int max_reconnect_attempts;       // 最大重连尝试次数
} client_session_t;

// 初始化客户端
int client_init(void);

// 初始化会话
int client_session_init(client_session_t *session);

// 连接服务器
int client_connect(client_session_t *session, const char *server_ip, int port);

// 执行SM2密钥交换
int client_key_exchange(client_session_t *session);

// 用户注册
int client_register(client_session_t *session, const char *username, const char *password);

// 用户认证
int client_authenticate(client_session_t *session, const char *username, const char *password);

// 获取文件列表
int client_get_file_list(client_session_t *session, const char *path, void **file_list, int *file_count);

// 上传文件
int client_upload_file(client_session_t *session, const char *local_path, const char *remote_path);

// 下载文件
int client_download_file(client_session_t *session, const char *remote_path, const char *local_path);

// 删除文件
int client_delete_file(client_session_t *session, const char *remote_path);

// 取消文件传输
int client_cancel_transfer(client_session_t *session);

// 获取文件传输进度
int client_get_transfer_progress(client_session_t *session, uint64_t *transferred, uint64_t *total);

// 断开连接
int client_disconnect(client_session_t *session);

// 清理客户端
void client_cleanup(void);

#endif // CLIENT_H